from drf_spectacular.extensions import OpenApiViewExtension
from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiExample
from drf_spectacular.types import OpenApiTypes


class NotificationViewSetOpenApi(OpenApiViewExtension):
    target_class = 'notification_app.views.NotificationViewSet'

    def view_replacement(self):
        from rest_framework.decorators import action
        from .serializers import (
            NotificationSerializer, NotificationCreateSerializer,
            NotificationListSerializer
        )

        class Extended(self.target_class):
            @extend_schema(
                summary="创建通知",
                description="""
创建一个新的平台级别通知。

权限说明：
- 只有管理员可以创建通知
""",
                request=NotificationCreateSerializer,
                responses={201: NotificationSerializer},
                tags=["Notifications"],
            )
            def create(self):
                pass

            @extend_schema(
                summary="获取通知列表",
                description="""
获取当前用户的通知列表。

权限说明：
- 只有通过认证的用户可以访问此接口
- 用户只能获取自己的通知

业务逻辑：
- 支持按通知类型、是否已读等条件筛选

通知类型(notification_type)可选值：
- ORDER ('order') - 订单通知
- PAYMENT ('payment') - 支付通知
- SYSTEM ('system') - 系统通知
- MESSAGE ('message') - 消息通知
""",
                parameters=[
                    OpenApiParameter(
                        name='is_read',
                        type=OpenApiTypes.BOOL,
                        location=OpenApiParameter.QUERY,
                        description='是否已读筛选',
                        required=False
                    ),
                    OpenApiParameter(
                        name='notification_type',
                        type=OpenApiTypes.STR,
                        location=OpenApiParameter.QUERY,
                        description='通知类型筛选',
                        required=False
                    ),
                ],
                responses={200: NotificationListSerializer(many=True)},
                tags=["Notifications"],
            )
            def list(self):
                pass

            @extend_schema(
                summary="通知详情",
                description="""
获取指定通知的详细信息。

权限说明：
- 只有通过认证的用户可以访问此接口
- 用户只能获取自己的通知
""",
                responses={200: NotificationSerializer},
                tags=["Notifications"],
            )
            def retrieve(self):
                pass

            @extend_schema(
                summary="标记通知为已读",
                description="""
将指定的通知标记为已读。

权限说明：
- 只有通过认证的用户可以访问此接口
- 用户只能标记自己的通知为已读
""",
                responses={
                    200: NotificationSerializer,
                    403: OpenApiTypes.OBJECT,
                    404: OpenApiTypes.OBJECT
                },
                tags=["Notifications"],
            )
            @action(detail=True, methods=['post'])
            def mark_as_read(self):
                pass

            @extend_schema(
                summary="批量标记通知为已读",
                description="""
批量将通知标记为已读。

权限说明：
- 只有通过认证的用户可以访问此接口
- 用户只能标记自己的通知为已读
""",
                request=None,
                responses={
                    200: OpenApiTypes.OBJECT,
                    403: OpenApiTypes.OBJECT
                },
                tags=["Notifications"],
            )
            @action(detail=False, methods=['post'], url_path='mark-all-as-read')
            def mark_all_as_read(self):
                pass

            @extend_schema(
                summary="取消/删除通知",
                description="""
取消/删除指定的通知。
        
权限说明：
- 只有通过认证的用户可以访问此接口
- 用户只能删除自己的通知
""",
                responses={
                    200: OpenApiTypes.OBJECT,
                    403: OpenApiTypes.OBJECT,
                    404: OpenApiTypes.OBJECT
                },
                tags=["Notifications"],
            )
            @action(detail=True, methods=['post'])
            def cancel(self):
                pass

        return Extended